/**
 * 创建时间：2025-09-22
 * 主要是后端方法所用到的一些js方法
 */
import bcrypt from "bcryptjs";

/**
 * 生成符合RFC4122标准的版本4 UUID
 * 
 * @returns { string } 生成的UUID字符串，格式为8-4-4-4-12的36字符十六进制串
 * 
 * @example
 * // 返回示例："f47ac10b-58cc-4372-a567-0e02b2c3d479"
 * const uuid = guid();
 */
export const guid = () => {
    // 使用模板字符串替换生成UUID
    return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
        // 生成随机16进制数 (0-15)
        var r = Math.random() * 16 | 0,
        // 如果是'x'则取随机值，如果是'y'则取特定范围值(8,9,a,b)
            v = c === "x" ? r : (r & 0x3 | 0x8);
        // 转换为16进制字符串
        return v.toString(16);
    })
};

/**
 * 密码哈希加密模块
 * 使用bcrypt算法对明文密码进行安全哈希处理
 * 
 * @module passwordHasher
 * @async
 * @param { string } plain - 需要哈希的明文密码
 * @returns { Promise<string> } 返回Promise，解析为加盐后的哈希字符串
 * @throws { Error } 当哈希过程失败时抛出错误
 * 
 * @example
 * // 使用示例
 * hash('mypassword123')
 * .then(hashed => console.log('Hashed password:', hashed))
 * .catch(err => console.error('Hashing failed:', err));
 */
export const hash = async (plain) => {
    try {
        // 生成加密盐，工作因子设为10（2^10次哈希迭代）
        const salt = await bcrypt.genSalt(10);
        // 使用生成的盐对明文密码进行哈希处理
        return await bcrypt.hash(plain, salt);
    } catch (error) {
        console.error("加密失败：", error);
        throw new Error("加密失败");
    }
};

/**
 * 密码验证模块
 * 使用bcrypt算法比对明文密码与存储的哈希值是否匹配
 * 
 * 
 * @param { string } plain - 待验证的明文密码
 * @param { string } hash - 数据库存储的哈希密码
 * @returns { Promise<boolean> } 返回Promise，解析为布尔值表示是否匹配
 * @throws { Error } 当验证过程出现异常时抛出错误
 * 
 * @example
 * // 使用示例
 * compare('inputPassword', 'storedHash').then(isMatch => {
 *      if(isMatch) console.log('密码正确');
 *      else console.log('密码错误');
 * }).catch(err => console.error('验证出错:', err));
 */
export const compare = async (plain, hash) => {
    try {
        return await bcrypt.compare(plain, hash);
    } catch (error) {
        console.error("验证失败:", err);
        throw new Error("验证失败");
    }
};